#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

#define BUFSIZE 128

int main(void)
{
    pid_t pid;
    char *str[BUFSIZE] = {};
    char *line = NULL, *line_copy = NULL, *token = NULL;
    size_t line_size = 0, i;
    ssize_t read;

    while (1) {
        /* 等待获取用户输入命令 */
        printf(">:");
        fflush(stdout);          // 刷新缓冲区
        read = getline(&line, &line_size, stdin);

        if (-1 == read) {
            free(line);
            break;               // 输入结束或出错
        }

        /* 解析命令字符串 */
        line[read - 1] = '\0';
        line_copy = line;
        i = 0;
        while ((token = strsep(&line_copy, " ")) != NULL && i < BUFSIZE - 1)
            str[i++] = token;    // 使用 strsep 分割字符串
        str[i] = NULL;           // 补上结尾的 NULL
        
        /* 创建子进程并执行命令 */
        pid = fork();            // 创建子进程

        if (-1 == pid) {
            perror("fork()");
            continue;
        }

        if (0 == pid)
            execvp(str[0], str); // 进程替换

        wait(NULL);              // 等待子进程结束
        free(line);
        line_size = 0;
    }
}
